package com.sugarcrm.candybean.configuration;
import static org.junit.Assert.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.FileHandler;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import org.junit.BeforeClass;
import org.junit.Test;
import com.sugarcrm.candybean.automation.Candybean;
import com.sugarcrm.candybean.utilities.Utils;
/**
* Logger unit test that checks to see if the logging configuration is always reading from the default configuration file.
*
* @author Shehryar Farooq
*/
public class LoggerUnitTest {
private static Candybean candybean;
private Logger logger = Logger.getLogger(LoggerUnitTest.class.getSimpleName());
@BeforeClass
public static void setUp() throws Exception {
String candybeanConfigStr = System.getProperty(Candybean.CONFIG_KEY, Candybean.getDefaultConfigFile());
Configuration candybeanConfig = new Configuration(new File(Utils.adjustPath(candybeanConfigStr)));
candybean = Candybean.getInstance(candybeanConfig);
}
/**
* A system test for the default configured logger.
*
* @throws IOException
* @throws SecurityException
*/
@Test
public void defaultConfiguredLogger() throws SecurityException, IOException {
// We remove the system property that tells the logger where to
// configure the logger from.
System.clearProperty("java.util.logging.config.file");
LogManager.getLogManager().reset();
this.logger = Logger.getLogger("SomeLogger");
// The logger should have no file handlers, so we
// check to see if that is the case.
assertEquals(this.logger.getHandlers().length, 0);
File file = new File("./log/" + LoggerUnitTest.class.getSimpleName() + ".log");
file.deleteOnExit();
}
/**
* A system test for a logger configured using the candybean logger
* configuration.
*
* @throws Exception
*/
@Test
public void cbConfiguredLogger() throws Exception {
String name1 = this.getClass().getSimpleName() + "1";
String name2 = this.getClass().getSimpleName() + "2";
String config1Path = Candybean.ROOT_DIR + File.separator + name1 + ".config";
String config2Path = Candybean.ROOT_DIR + File.separator + name2 + ".config";
String log1Path = Candybean.ROOT_DIR + File.separator + "log" + File.separator + name1 + ".log";
String log2Path = Candybean.ROOT_DIR + File.separator + "log" + File.separator + name2 + ".log";
// Load the initial properties from the candybean config file
Properties initialProperties = candybean.config.getPropertiesCopy();
// Change the FileHandler Formatter to XMLFormatter
initialProperties.setProperty("java.util.logging.FileHandler.formatter", "java.util.logging.XMLFormatter");
initialProperties.setProperty("java.util.logging.ConsoleHandler.formatter", "java.util.logging.XMLFormatter");
// Create a new config file and write props to that file
File config1File = new File(config1Path);
config1File.createNewFile();
initialProperties.store(new FileOutputStream(config1File), null);
// Update the system property that specifies where to load the logging configuration from.
System.setProperty("java.util.logging.config.file", config1Path);
LogManager.getLogManager().readConfiguration();
logger = Logger.getLogger(this.getClass().getSimpleName());
// Log to file and verify text
File log1File = new File(log1Path);
FileHandler firstFileHandler = new FileHandler(log1Path);
logger.addHandler(firstFileHandler);
logger.info("First logged message configured using candybean configuration file");
assertTrue(log1File.exists());
assertEquals(getLinesInLogFile(log1File), 14);
// Change the FileHandler Formatter to SimpleFormatter
initialProperties.setProperty("java.util.logging.FileHandler.formatter", "java.util.logging.SimpleFormatter");
initialProperties.setProperty("java.util.logging.ConsoleHandler.formatter", "java.util.logging.SimpleFormatter");
// Create a second config file and write props to that file
File config2File = new File(config2Path);
config2File.createNewFile();
initialProperties.store(new FileOutputStream(config2File), null);
// Update the system property that specifies where to load the logging configuration from.
System.setProperty("java.util.logging.config.file", config2Path);
LogManager.getLogManager().readConfiguration();
logger = Logger.getLogger(this.getClass().getSimpleName());
// Log to file and verify text
File log2File = new File(log2Path);
FileHandler secondFileHandler = new FileHandler(log2Path);
logger.addHandler(secondFileHandler);
logger.info("Second logged message configured using different candybean configuration file");
assertTrue(log2File.exists());
assertTrue(getLinesInLogFile(log2File) < 13);
// Reset the logging config file path to the default and re-read the configuration
System.setProperty("java.util.logging.config.file", candybean.config.configFile.getCanonicalPath());
LogManager logManager = LogManager.getLogManager();
logManager.readConfiguration();
// Delete all created configuration and log files
config1File.delete();
log1File.delete();
config2File.delete();
log2File.delete();
}
/**
* Reads a file to see how many lines it contains.
*
* @param file The file to read
* @return The number of lines in the file
* @throws IOException
*/
private int getLinesInLogFile(File file) throws IOException {
int counter = 0;
BufferedReader logReader = new BufferedReader(new FileReader(file));
@SuppressWarnings("unused")
String line;
while ((line = logReader.readLine()) != null) {
counter++;
}
logReader.close();
return counter;
}
}